package org.ehe.erp.service.product;

import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import org.ehe.erp.domain.product.ErpProductCategory;
import org.ehe.erp.domain.product.bo.ErpProductCategoryBo;
import org.ehe.erp.domain.product.vo.ErpProductCategoryVo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import static org.ehe.common.core.utils.collection.CollectionUtils.convertMap;

/**
 * 产品分类Service接口
 *
 * @author zhangnn
 * @date 2024-05-01
 */
public interface IErpProductCategoryService extends IService<ErpProductCategory> {

    /**
     * 查询产品分类
     */
    ErpProductCategoryVo queryById(Long id);


    /**
     * 查询产品分类列表
     */
    List<ErpProductCategoryVo> queryList(ErpProductCategoryBo bo);

    /**
     * 新增产品分类
     */
    Boolean insertByBo(ErpProductCategoryBo bo);

    /**
     * 修改产品分类
     */
    Boolean updateByBo(ErpProductCategoryBo bo);

    /**
     * 校验并批量删除产品分类信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 是否存在分类子节点
     *
     * @param id 产品分类id
     * @return 结果
     */
    boolean hasChildById(Long id);

    /**
     * 校验产品分类和产品名称是否唯一
     *
     * @param bo 产品分类信息
     * @return 结果
     */
    boolean isUniqueNameAndCode(ErpProductCategoryBo bo);


    /**
     * 查询产品分类树结构信息
     *
     * @param bo 产品信息
     * @return 产品树信息集合
     */
    List<Tree<Long>> selectCategoryTreeList(ErpProductCategoryBo bo);

    /**
     * 构建前端所需要下拉树结构
     *
     * @param categorys c产品列表
     * @return 下拉树结构列表
     */
    List<Tree<Long>> buildDeptTreeSelect(List<ErpProductCategoryVo> categorys);

    /**
     * 获得产品分类列表
     *
     * @param categoryCodes 编号数组
     * @return 产品分类列表
     */
    List<ErpProductCategoryVo> getProductCategoryList(Collection<String> categoryCodes);
    /**
     * 获得产品分类 Map
     *
     * @param categoryCodes 编号数组
     * @return 产品分类 Map
     */
    default Map<String, ErpProductCategoryVo> getProductCategoryMap(Collection<String> categoryCodes) {
        return convertMap(getProductCategoryList(categoryCodes), ErpProductCategoryVo::getFullCode);
    }


    /**
     * 自动生成分类编码
     * @param parentId 父分类ID
     * @return 生成的编码
     */
    String generateCategoryCode(Long parentId);

    /**
     * 上移分类（减小排序号）
     * @param id 分类ID
     * @return 操作结果
     */
    Boolean moveUp(Long id);

    /**
     * 下移分类（增加排序号）
     * @param id 分类ID
     * @return 操作结果
     */
    Boolean moveDown(Long id);



    /**
     * 校验产品分类名称是否唯一（排除自己）
     * @param bo 产品分类业务对象
     * @return true-唯一，false-重复
     */
    boolean isUniqueNameForUpdate(ErpProductCategoryBo bo);

    /**
     * 校验产品分类编码是否唯一（排除自己）
     * @param bo 产品分类业务对象
     * @return true-唯一，false-重复
     */
    boolean isUniqueCodeForUpdate(ErpProductCategoryBo bo);

    /**
     * 校验是否修改为自己的子分类
     * @param categoryId 当前分类ID
     * @param newParentId 新的父分类ID
     * @return true-合法，false-不能修改为子分类
     */
    boolean isValidParentChange(Long categoryId, Long newParentId);

    /**
     * 获取所有子分类ID（递归）
     * @param parentId 父分类ID
     * @return 所有子分类ID列表
     */
    List<Long> getAllChildrenIds(Long parentId);
    /**
     * 获取分类名称（用于错误提示）
     */
    String getCategoryNameById(Long parentId);

    List<ErpProductCategory> getCategoryPath(Long childId);

    ErpProductCategoryVo selectByCode(String categoryCode);

    List<String> buildCategoryOptions(List<ErpProductCategory> categories);

    List<ErpProductCategory> findActiveCategories(String tenantId);

    /**
     * 获取分类联动
     * @param parentId
     * @return
     */
    List<ErpProductCategory> categoryList(Long parentId);
}
